package com.ct.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class WebMvcConfig {

    /**
     * 配置 CORS（跨域资源共享）过滤器
     * 允许所有来源、请求头、请求方法，并支持携带凭证（如 Cookie）
     * 确保跨域请求在其他过滤器之前处理，避免被拦截
     */
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilterBean() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true); // 允许携带凭证（如 Cookie）
        corsConfiguration.addAllowedOriginPattern("*"); // 允许所有来源（使用 * 适用于前端动态域名）
        corsConfiguration.addAllowedHeader("*"); // 允许所有请求头
        corsConfiguration.addAllowedMethod("*"); // 允许所有 HTTP 方法（GET, POST, PUT, DELETE 等）

        // 配置 CORS 规则的 URL 映射
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration); // 适用于所有请求路径

        // 注册 CORS 过滤器
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));

        /**
         * 设置过滤器的执行顺序
         * - `Ordered.HIGHEST_PRECEDENCE` 表示最高优先级，确保 CORS 过滤器最先执行
         * - 这样可以避免 CORS 请求在进入其他过滤器（如 Spring Security）前被拦截
         */
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return bean;
    }
}